本发明提出一种扫描文件的方法和装置,其中方法包括:监测到文件的操作时,获取所述文件的文件对象;切换到扫描引擎的进程空间,为所述文件对象创建内存映射,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;扫描引擎利用所述文件对象的内存映射句柄扫描所述文件。本发明能够避免扫描引擎第二次打开文件,从而提高效率,避免多个杀毒软件互相拦截。
1.一种扫描文件的方法,应用于杀毒软件中扫描引擎对文件的扫描,其特征在于,所述方法包括:监测到文件的操作时,通过微过滤驱动Minifilter提供的数据结构指针获取所述文件的文件对象;切换到扫描引擎的进程空间,在扫描引擎的进程空间中为所述文件对象创建内存映射,切换到之前的进程空间,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;扫描引擎利用所述文件对象的内存映射句柄扫描所述文件。
2.根据权利要求1所述的方法,其特征在于,所述切换到扫描引擎的进程空间的方式为:通过KeStackAttachProcess应用程序编程接口API实现切换到扫描引擎的进程空间。
3.根据权利要求1或2所述的方法,其特征在于,所述为文件对象创建内存映射的方式为:使用FsRtlCreateSectionForDataScan创建内存映射。
4.根据权利要求1或2所述的方法,其特征在于,所述为文件对象创建内存映射的方式为:当文件对象指向的内存映射区对象指针不为空、并且当前I/O请求不在系统其他内核组件的路径时,进入临界区获取所述文件对象的互斥锁,并设置禁止系统其他内核组件进入当前I/O请求所在路径的标记;获取所述文件的大小,当所述文件的大小不为零时,为文件对象创建内存映射区,将内存映射区对象插入到对象管理器中;释放所述互斥锁,退出所述临界区。
5.根据权利要求1或2所述的方法,其特征在于,所述将文件对象的内存映射句柄传递到扫描引擎的进程空间的方式为:通过Minifilter提供的FltSendMessage进行传递。
6.一种扫描文件的装置,其特征在于,所述装置包括:文件对象获取模块,用于监测到文件的操作时,通过微过滤驱动Minifilter提供的数据结构指针获取所述文件的文件对象,并指示映射模块映射所述文件对象;映射模块,用于按照所述文件对象获取模块的指示切换到扫描引擎的进程空间,在扫描引擎的进程空间中为所述文件对象创建内存映射,切换到之前的进程空间,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;扫描引擎模块,用于利用所述文件对象的内存映射句柄扫描所述文件。
7.根据权利要求6所述的装置,其特征在于,所述映射模块包括:初始设置子模块,用于当文件对象指向的内存映射区对象指针不为空、并且当前I/O请求不在系统其他内核组件的路径时,进入临界区获取所述文件对象的互斥锁,并设置禁止系统其他内核组件进入当前I/O请求所在路径的标记,指示映射执行子模块为文件对象创建内存映射;映射执行子模块,用于在接收到初始设置子模块的指示时,获取所述文件的大小,当所述文件的大小不为零时,为文件对象创建内存映射区,将内存映射区对象插入到对象管理器中,指示完成设置子模块退出初始设置;完成设置子模块,用于在接收到映射执行子模块的指示时,释放所述互斥锁,并退出所述临界区。
技术领域本发明涉及杀毒软件技术领域,尤其涉及一种扫描文件的方法和装置。
背景技术目前,很多杀毒软件都是在监控到文件操作时,将文件名传递到扫描引擎,扫描引擎通过文件名打开文件后进行文件的扫描。这种方式需要扫描引擎通过文件名再次打开文件,效率低;并且,扫描引擎再次打开文件可能会造成在多个杀毒软件共存的情况下,多个杀毒软件互相拦截的情况。
发明内容本发明提供了一种扫描文件的方法,能够避免扫描引擎第二次打开文件。本发明还提供了一种扫描文件的装置,能够避免扫描引擎第二次打开文件。本发明的技术方案是这样实现的:一种扫描文件的方法,应用于杀毒软件中扫描引擎对文件的扫描,该方法包括:监测到文件的操作时,获取所述文件的文件对象;切换到扫描引擎的进程空间,为所述文件对象创建内存映射,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;扫描引擎利用所述文件对象的内存映射句柄扫描所述文件。上述方法中,获取文件的文件对象的方式为:通过微过滤驱动(Minifilter)提供的数据结构指针获取所述文件的文件对象。切换到扫描引擎的进程空间的方式为:通过KeStackAttachProcess应用程序编程接口(API)实现切换到扫描引擎的进程空间。为文件对象创建内存映射的方式为:使用FsRtlCreateSectionForDataScan创建内存映射。为文件对象创建内存映射的方式为:当文件对象指向的内存映射区对象指针不为空、并且当前I/O请求不在系统其他内核组件的路径时,进入临界区获取所述文件对象的互斥锁,并设置禁止系统其他内核组件进入当前I/O请求所在路径的标记;获取所述文件的大小,当所述文件的大小不为零时,为文件对象创建内存映射区,将内存映射区对象插入到对象管理器中;释放所述互斥锁,退出所述临界区。将文件对象的内存映射句柄传递到扫描引擎的进程空间的方式为:通过Minifilter提供的FltSendMessage进行传递。一种扫描文件的装置,包括:文件对象获取模块,用于监测到文件的操作时,获取所述文件的文件对象;映射模块,用于按照所述文件对象获取模块的指示切换到扫描引擎的进程空间,为所述文件对象创建内存映射,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;扫描引擎模块,用于利用所述文件对象的内存映射句柄扫描所述文件。上述装置中,映射模块包括:初始设置子模块,用于当文件对象指向的内存映射区对象指针不为空、并且当前I/O请求不在系统其他内核组件的路径时,进入临界区获取所述文件对象的互斥锁,并设置禁止系统其他内核组件进入当前I/O请求所在路径的标记,指示映射执行子模块为文件对象创建内存映射;映射执行子模块,用于在接收到初始设置子模块的指示时,获取所述文件的大小,当所述文件的大小不为零时,为文件对象创建内存映射区,将内存映射区对象插入到对象管理器中,指示完成设置子模块退出初始设置;完成设置子模块,用于在接收到映射执行子模块的指示时,释放所述互斥锁,并退出所述临界区。可见,本发明提出的扫描文件的方法和装置,通过扫描引擎在扫描时直接利用已打开的文件对象的内存映射句柄来对文件进行扫描,避免了扫描引擎第二次打开文件,从而提高效率,避免多个杀毒软件互相拦截。
附图说明图1为本发明提出的扫描文件的方法流程图;图2为本发明实施例二中步骤三的实现流程图;图3为本发明提出的扫描文件的装置结构示意图。
具体实施方式本发明提出一种扫描文件的方法,应用于杀毒软件中扫描引擎对文件的扫描。如图1为本发明提出的扫描文件的方法流程图,包括以下步骤:步骤101:监测到文件的操作时,获取所述文件的文件对象;步骤102:切换到扫描引擎的进程空间,为所述文件对象创建内存映射,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;步骤103:扫描引擎利用所述文件对象的内存映射句柄扫描所述文件。以下举具体的实施例详细介绍。实施例一:本实施例主要包括以下四个步骤:步骤一、获取文件对象,可以通过Minifilter提供的数据结构指针获取文件对象,具体实现代码可以为:
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>步骤二、切换到扫描引擎进程空间,可以通过KeStackAttachProcessxa0API实现,具体实现代码可以为:KeStackAttachProcess(FilterData.UserProcess,&xa0kAcpState);步骤三、为文件对象创建内存映射,在windowsxa0xpxa0sp3以上内核(包括windowsxa0xpxa0sp3内核)中,可以使用FsRtlCreateSectionForDataScan,在windowsxpxa0sp3以下内核(不包括windowsxa0xpxa0sp3内核)中,采用本发明提出的方法实现此应用程序编程接口(API)。以下首先详细介绍在windowsxa0xpxa0sp3以上内核中使用FsRtlCreateSectionForDataScan的具体实现方式,windowsxa0xpxa0sp3以下内核中的实现方式将在实施例二中进行介绍。
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>步骤四、将内存映射句柄传递到扫描引擎进程,可以通过Minifilter提供的FltSendMessage传递,具体实现代码可以为:
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>实施例二:本实施例主要包括四个步骤:步骤一,获取文件对象;步骤二,切换到扫描引擎进程空间;步骤三,为文件对象创建内存映射;步骤四,将内存映射句柄传递到扫描引擎进程。其中,步骤一、二和四的具体实现过程与实施例一相同,在此不赘;以下主要介绍本实施例的步骤三,即在windowsxa0xpxa0sp3以下内核中创建内存映射的方法,如图2为本发明实施例二中步骤三的实现流程图,包括:步骤201:判断文件对象的SectionObjectPointer是否为空,如果为空,表示系统未为该文件对象建立缓存,则释放资源,返回错误码,并退出;如果不为空,则继续执行步骤202。步骤202:判断当前线程的TopLevelIrp是否不为空,如果不为空,表示当前I/O请求在系统其他内核组件的代码路径中,有可能死锁,故释放资源,返回错误码,并退出;如果为空,则继续执行步骤203。步骤203:进入临界区并获取文件互斥锁。步骤204:设置TolLevelIrp为FSRTL_FSP_TOP_LEVEL_IRP,表明此次I/O请求在为文件对象创建内存映射的代码路径里,以避免其他内核组件重入。步骤205:获取文件大小,判断文件大小是否为0,如果为0,则无法创建映射,故退出临界区,恢复TopLevelIrp为空,释放资源,返回错误码,并退出;如果不为0,则执行步骤206。步骤206:调用MmCreateSection创建内存映射区。步骤207:增加区对象引用技术,并将内存映射区对象插入到对象管理器中。步骤208:退出临界区,恢复TopLevelIrp为空,返回成功,退出。上述过程可以具体采用以下代码实现:
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="630"/>
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="467"/>
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="472"/>
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="508"/>本发明还提出一种扫描文件的装置,如图3为本发明提出的扫描文件的装置结构示意图,该装置包括:文件对象获取模块310,用于监测到文件的操作时,获取所述文件的文件对象;映射模块320,用于按照文件对象获取模块310的指示切换到扫描引擎的进程空间,为所述文件对象创建内存映射,将所述文件对象的内存映射句柄传递到所述扫描引擎的进程空间;扫描引擎模块330,用于利用所述文件对象的内存映射句柄扫描所述文件。上述映射模块320可以包括:初始设置子模块321,用于当文件对象指向的内存映射区对象指针不为空、并且当前I/O请求不在系统其他内核组件的路径时,进入临界区获取所述文件对象的互斥锁,并设置禁止系统其他内核组件进入当前I/O请求所在路径的标记,指示映射执行子模块322为文件对象创建内存映射;映射执行子模块322,用于在接收到初始设置子模块321的指示时,获取所述文件的大小,当所述文件的大小不为零时,为文件对象创建内存映射区,将内存映射区对象插入到对象管理器中,指示完成设置子模块323退出初始设置;完成设置子模块323,用于在接收到映射执行子模块322的指示时,释放所述互斥锁,并退出所述临界区。综上可见,本发明提出的一种扫描文件的方法和装置,当监控到文件操作并传递给扫描引擎时,可以复用打开的文件对象,通过此文件对象在扫描引擎的进程中创建内存映射,则扫描引擎在扫描时可以直接利用已打开的文件句柄来对文件进行扫描,从而避免了扫描引擎对第二次打开文件,提高了效率,同时避免多个杀毒软件互相拦截的情况。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。